<html>
<head><title>Curry kevytspesifikaatio</title></head>
<body>
<h1>Curry kevytspesifikaatio</h1>
<h2>Esimerkki: Fibonaccin lukuja</h2>

<p>Seuraava ohjelma lukee yhden luvun ja tulostaa ensimmäisen Fibonaccin luvun joka on sitä suurempi.</p>

<p>fib n on n:s Fibonaccin luku. Luvut lasketaan selkeyden vuoksi naiivilla rekursiivisella tavalla joka on käsittämättömän hidas.</p>

<p>fibs on ääretön lista joka sisältää kaikki Fibonaccin luvut.</p>

<p>Ohjelma ajetaan helpoiten lataamalla se jonkun Curry-ympäristön interaktiiviseen tilaan ja antamalla komento main. mainin ensimmäinen rivi lukee yhden rivin. Toinen rivi tulostaa ensimmäisen luvun siitä äärettömästä listasta joka sisältää kaikki Fibonaccin luvut jotka ovat pienempiä kuin kokonaislukuna parsittu syöttörivi.</p>

<code>
import Read

fib :: Int -> Int
fib n = case n of
  0 -> 0
  1 -> 1
  k -> fib (k-1) + fib (k-2)

fibs :: [Int]
fibs = [fib n | n <- [0..]]

main :: IO ()
main = do
  x <- getLine
  print (head [f | f <- fibs, readInt x < f])
</code>
<ol>
<hr>
********* 1. harjoitusviikko: *******
<hr>

<li>Kielen taustaa ja miniesimerkki:
    <ul>
    <li> kuka/ketkä-missä-milloin-miksi, mihin käyttöön, ...,
    <li> tyypillinen toteutustapa: kääntäjä, tulkki, ...
    <li> käyttökohteet
    <li>...
    <li> lyhyt <b>selostettu</b> esimerkki ohjelmasta, joka lukee
         yhden syöttöluvun, laskee ensimmäisen Fibonaccin luvun,
         joka on syöttölukua suurempi ja lopuksi tulostaa 
         kyseisen Fibonaccin luvun

    </ul>

<li>Alkiorakenne &ndash; millaisista palikoista ohjelmat rakennetaan:
<ul>
<li>tunnukset
<li>varatut sanat, avainsanat
<li>literaalivakiot
<li>erottimet, sisennykset, rivinvaihdot
<li>...
<li>havainnollisia <b>selostettuja</b> pieniä esimerkkejä
<li>arvio kieleen valittujen ratkaisujen eduista ja haitoista
</ul>

<hr>
********* 2. harjoitusviikko: *******
<hr>

<li>Tunnusten näkyvyysalueet &ndash; miten ja missä itse määritellyt 
     rakenteet ovat käytettävissä: 
<ul>
<li>lohkorakenne
<li>sidonta &ndash; staattinen ~ dynaaminen
<li>sulkeumat
<li>ensimmäisen, toisen ja kolmannen luokan arvot
<li>...
<li>havainnollisia <b>selostettuja</b> pieniä ohjalmaesimerkkejä
<li>arvio kieleen valittujen ratkaisujen eduista ja haitoista
</ul>

<hr>
********* 3. harjoitusviikko: *******
<hr>

<li>Kontrollin ja/tai laskennan ohjaus  &ndash; miten perustoiminnallisuudet
    ilmaistaan: 
<ul>
<li>valinta
<li>toisto eli iteraatio
<li>rekursio ja häntärekursio
<li>...
<li>havainnollisia <b>selostettuja</b> pieniä ohjalmaesimerkkejä
<li>arvio kieleen valittujen ratkaisujen eduista ja haitoista
</ul>


<li>Perustietotyypit &ndash; millaisilla arvoilla tai "datalla" pelataan: 
<ul>
<li>alkeis-/perustyypit
<li>arvoalueet, standardoidut vai implementaatiokohtaiset, ...
<li>vahva tyypitys ~ heikko tyypitys
<li>staattinen tyypitys ~ dynaaminen tyypitys
<li>...
<li>havainnollisia <b>selostettuja</b> pieniä ohjalmaesimerkkejä
<li>arvio kieleen valittujen ratkaisujen eduista ja haitoista
</ul>

<hr>
********* 4. harjoitusviikko: *******
<hr>

<li>Laskennan kapselointi &ndash; miten toiminnallisuuksia 
    abstrahoidaan ja niistä rakennetaan uusia toiminnallisuuksia:

<ul>
<li>nimetyt aliohjelmat ja/tai alifunktiot
<li>parametrivälitys
<li>tyypillisiä ohjelma-arkkitehtuureja
<li>...
<li>havainnollisia <b>selostettuja</b> pieniä ohjalmaesimerkkejä
<li>arvio kieleen valittujen ratkaisujen eduista ja haitoista
</ul>

<hr>
********* 5. harjoitusviikko: *******
<hr>

<li>Datan kapselointi  &ndash; millaisiksi rakenteiksi 
    dataa voidaan koota:

<ul>
<li>rakenteiset ja/tai kapseloidut tyypit
<li>oliot ja luokat
<li>arvo- ja viitesemantiikka
<li>...
<li>havainnollisia <b>selostettuja</b> pieniä ohjalmaesimerkkejä
<li>arvio kieleen valittujen ratkaisujen eduista ja haitoista
</ul>

<hr>
********* Julkinen <i>Grande Finale</i> luennolla 28.4.: *******
<hr>

<li>Yhteenveto: kielen vahvuudet ja heikkoudet, 
    suositellut ja varottavat käyttökohteet



</ol>
</body>
</html>